#ifndef THREAD_INTF_H
#define THREAD_INTF_H

#include "lvos.h"

#ifdef __cplusplus
extern "C" {
#endif

#if DESC("线程池")
/**
 * @brief 初始化线程池
 * @return 成功返回0，失败返回-1
 */
typedef struct TPool TPool;

/**
 * @brief 创建线程池
 * @param ppPool 输出参数，返回创建的线程池指针
 * @param threadCount 要创建的线程数量(1-10)
 * @return 成功返回0，失败返回-1
 */
int32_t CreatePThreadPool(TPool** ppPool, uint32_t threadCount);

/**
 * @brief 向线程池添加任务
 * @param pool 线程池实例
 * @param function 任务函数指针
 * @param argument 任务参数
 * @return 成功返回0，失败返回-1
 */
int32_t ThreadPoolAddTask(TPool* pool, void (*function)(void*), void* argument);

/**
 * @brief 销毁线程池
 * @param pool 要销毁的线程池实例
 */
void ThreadPoolDestroy(TPool* pool);

#endif

#if DESC("信号量")

typedef struct TagSyncContext {
    void *lwtSem;
    void *pThreadSem;

    void *ctx;
    int32_t ret;
} SyncContext;

int32_t InitSyncContext(SyncContext *syncContext);

void WaitSyncContext(SyncContext *syncContext);

void DestroySyncContext(SyncContext *syncContext);

void AsyncToSyncCb(SyncContext *syncContext, int32_t ret);

#endif

#if DESC("LWT")

int32_t LwtModuleInit(void);

int32_t LwtCreate(void (*func)(void *ctx), void *ctx, const char *funcName, int32_t line);

#define LWT_CREATE(func, ctx) \
    LwtCreate(func, ctx, __func__, __LINE__)

void LwtStartEventLoop(void);

void LwtSleep(uint32_t ms);

bool IsLwtContext(void);

#ifdef __cplusplus
}
#endif

#endif
#endif // THREAD_INTF_H
